package blog


inline fun fun1(l: () -> Unit) {
    l()
}

fun fun2(l: () -> Unit) {
    l()
}

/**
 * 可以指定某个lambda表达式不内联
 */
inline fun fun3(noinline p1: () -> Unit, p2: () -> Unit) {
    p1()
    p2()
}

/**
 * crossinline???
 */
inline fun f(crossinline body: () -> Unit) {
    val f1 = Runnable { body() }
}


class Foo

//自kotlin 1.1起, inline可修饰[没有幕后字段]属性访问器get/set函数(方法)
inline var foo1: Foo
    get() = Foo()
    set(value) {}

val foo2: Foo
    inline get() = Foo()


/**
 * 1.带lambda表达式做参数的内联函数
 * -> 直接return  会return 外部函数体
 * -> return@标签  lambda内return
 *
 * 2.带lambda表达式做参数的非内联函数
 * ->要退出lambda表达式,return需要加限定符@标签
 *
 * 正常return(没有限定符@)表示退出一个命名或匿名函数
 *
 */
fun main(args: Array<String>) {

    fun3(returnLabel@{
        println("p1")
        return@returnLabel
    }, { println("p2") })

    //1.非内联函数实现return 必须加上return@标签
    //2.return@标签 只在lambda内return
    fun2 label@{
        println("fun2")
        return@label
    }

    //内联函数直接return main函数
    fun1 {
        println("fun1")
        return
    }

    println("end")

}

